//导入express
const express = require('express');
const fs = require('fs');
const path = require('path');
//创建应用对象
const app = express();
//创建路由
// app.get('/home',(req,res)=>{
//     //获取url和ip
//     let {url,ip}=req;
//     //将信息保存在文件access.log中
//     //输完$外面就有引号，是安装了Template String Converter插件
//     fs.appendFileSync(path.resolve(__dirname,'./access.log'),`${url} ${ip}\r\n`)
//     res.send('前台首页');
// });
// app.get('/admin',(req,res)=>{
//     //获取url和ip
//     let {url,ip}=req;
//     //输完$外面就有引号，是安装了Template String Converter插件
//     fs.appendFileSync(path.resolve(__dirname,'./access.log'),`${url} ${ip}\r\n`)
//     res.send('后台首页');
// });
//如果想要每一次访问都记录，每一个路由规则都这样写不好维护，指责就好比所有人不做任何检查直接上车，上车后再检查。工作量会变大，不好修改
//声明中间件函数,把公共代码都放到函数里面
function recordMiddleware(req,res,next){//req是接收请求报文的对象，res是接收响应报文的对象，next是一个内部函数，这个函数执行后会指向后续的路由回调或中间件函数回调
    //获取url和ip
    let {url,ip}=req;
    //将信息保存在文件access.log中
    fs.appendFileSync(path.resolve(__dirname,'./access.log'),`${url} ${ip}\r\n`)
    //调用next
    next();
}
//使用中间件函数
app.use(recordMiddleware);
//创建路由
app.get('/home',(req,res)=>{
    res.send('前台首页');
});
app.get('/admin',(req,res)=>{
    res.send('后台首页');
});
// app.all('*',(req,res)=>{
//     res.send('<h1>404 Not Found</h1>')
// })
//监听端口，启动服务
app.listen(3000,()=>{
    console.log('服务已经启动，端口30000正在监听中...');
})
//这样一来每个请求都会先执行中间件函数recordMiddleware在access.log里做一个记录，再执行路由函数，
// access.log其实是服务器的访问日志，前面还可以添加访问时间，服务器异常或者被入侵时都可以通过访问日志查看它是怎么请求的，以及请求的来源ip是哪里，更精准的定位问题